package kuonjisai;

import java.util.Scanner;

public class J32_Exception {

	
	// 예외처리 exception
	// 오류 처리는 프로그래밍 언어의 중요한 기능임
	// 좋은 오류 처리 매커니즘은 프로그래머가 
	// 보다 쉽게 견고한 프로그램을 작성하고
	// 몰래 섞여 들어오는 버그를 방지할 수 있음
	
	// 일부 언어에서는 발생가능한 모든 오류를 
	// 미리 감지하기 위해 강제로 다중 if문을 사용
	// 이런 경우 코드가 지나치게 복잡해 짐
	
	// 자바에서는 try 문을 사용하여 
	// 보다 쉽게 오류를 감지하고 처리
	
	// 오류error vs 예외exception
	// 프로그램의 정상실행을 방해하는 요소
	// 오류 : 프로그램의 잘못된 코드나
	// 			CPU 연산의 잘못된 동작으로 발생
	// 			컬파일 오류, 실행시간 오류로 다시 분류
	// * 컴파일 오류 : 잘못된 문법으로 인해 발생된 오류
	// * 실행시간 오류 : 잘못된 코드사용이나
	//							하드웨어의 오동작으로 인한 오류
	// 하드웨어적으로 발생하는 오류를 제외하고
	// 모든 오류는 개발자가 적절히 수정가능
	
	// 예외 : 일반적인 프로그램 실행 순서를 벗어나는 것
	// 프로그램 상에서 코드에 의해 예외를 바로 잡을 수 있음
	// 즉, 위에서 언급한 오류들을 코드에 의해 수습할 수 있는
	// 미약한 오류라는 의미도 있음
	
	// 실행시간 오류가 생길 것 같은 코드는
	// 일반적으로 try - catch - finally 문으로 격리 가능
	// 오류가 발생하면 try 블록의 처리를 중단하고
	// catch 블록으로 제어가 넘어감
	
	
	public static void main(String[] args) {

		
		
		
		// 오류가 발생하는 경우 - 코드 무시
		System.out.println( "이글이 보이나요?" );
		// System.out.println( 100 / 0 ); 			// 무시
		System.out.println( "이글도 보이나요?" );		

		// 오류가 발생하는 경우
		System.out.println( "이글이 보이나요?" );
		try{                                                                                                                   
		System.out.println( 100 / 0 );
		} catch ( Exception e ) {
			//System.out.println( "0으로 나눌수 없어요!");
			// e.printStackTrace();                         // 일반적인 처리방법
 			System.out.println( e.getMessage() );	
			
		}
		System.out.println( "이글도 보이나요?" );		

		
		// 1 - 10 사이 정수를 받아 출력하는 프로그램
		Scanner sc = new Scanner(System.in);
		int num;
		int sum;
	/*	while ( true ) {
		System.out.println( " 1 - 10 사이의 정수를 입력하세요" );
		num = 0;
		try {
			num = sc.nextInt();
			}  //try
			catch ( Exception e ) { 
					System.err.println( "숫자를 입렷해주세요!!");
					// 이전에 입력한 내용이 문자인 경우
					// Scanner 내부 저장소(버퍼)에 남아있기 때문에
					// 계속 무한반복으로 위 문장이 출력됨
					// Scanner 를 다시 초기화해야만 문제가 해결
					sc = new Scanner(System.in);
						
			} // catch
		System.out.println( "입력하신 숫자는 " + num );
		} // while
		*/

		// 예외 처리 1
		int[] name = new int[3];
	/*	try {
		name[0] = 1;
		name[1] = 2;
		name[2] = 3;
		name[3] = 4;
		} //try
		catch ( Exception e ) {
			System.err.println( "배열 크기를 초과" );
		} // catch
		
		// 예외처리 2
		int result = 0;
		try {
			for ( int i = 10; i >=0; --i ){
			
					result += (int)(Math.random() * 100) / i;
			
			
					System.out.println( result );
			} //for
		} // try
		catch ( Exception e ) {
			System.out.println( "0으로 나눌수 없어요!" );
		}
		
		System.out.println( "문제3: " + result );
		
*/		// 다중 예외 처리
		try {
			// System.out.println( 100/0 );
			char[] grade = new char[3];
			grade[3] = 'a';
		}
		 catch ( ArithmeticException ae ) {
			System.err.println( "0으로 나누지 못함" );
		}
		catch ( ArrayIndexOutOfBoundsException aiobe){
			System.err.println( "배열의 범위를 벗어났음");
		} 
		catch ( Exception e ) {
			System.out.println( "알수없는 오류발생!!" );
		}
		
		// 코드에서 발생할수 있는 예외가
		// 하나 이상인 경우 다중 catch 문으로
		// 각각의 예외에 따라 독자적인 오류처리를 할수있음
		
		
		
		
		
		
		
		} // main
	
} // class


